import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:ideology/shared/widgets/code_input/config/editor_config.dart';
import 'package:ideology/shared/widgets/code_input/highlight/languages/dartish.dart';
import 'package:ideology/shared/widgets/code_input/presentation/widgets/canvas_editor.dart';

void main() => runApp(const MyApp());

/// [MultimediaKeyShield]：顶层按键屏蔽组件。
///
/// 功能：
/// - 专门拦截多媒体键（音量、播放、暂停等）；
/// - 避免它们在 Flutter 内触发 **重复 KeyDown 断言**；
/// - 可放在应用的最外层，使内部编辑器或其他控件不再收到这些键事件。
///
/// 使用方式：
/// ```dart
/// return MultimediaKeyShield(
///   child: MaterialApp(home: ...),
/// );
/// ```
///
/// 默认屏蔽的按键集合包括：
/// - 音量键：`audioVolumeUp`、`audioVolumeDown`、`audioVolumeMute`
/// - 媒体控制：`mediaPlay`、`mediaPause`、`mediaPlayPause`、`mediaTrackNext`、`mediaTrackPrevious`、`mediaStop`
///
/// 逻辑说明：
/// - 在内部使用 [Focus] 节点，强制占据焦点；
/// - 在 [onKeyEvent] 中拦截指定按键并返回 [KeyEventResult.handled]；
/// - 其他按键返回 [KeyEventResult.ignored]，继续向下分发。
class MultimediaKeyShield extends StatelessWidget {
  const MultimediaKeyShield({super.key, required this.child});
  final Widget child;

  /// 默认屏蔽的多媒体键集合。
  static final Set<LogicalKeyboardKey> _blocked = {
    LogicalKeyboardKey.audioVolumeUp,
    LogicalKeyboardKey.audioVolumeDown,
    LogicalKeyboardKey.audioVolumeMute,
    LogicalKeyboardKey.mediaPlay,
    LogicalKeyboardKey.mediaPause,
    LogicalKeyboardKey.mediaPlayPause,
    LogicalKeyboardKey.mediaTrackNext,
    LogicalKeyboardKey.mediaTrackPrevious,
    LogicalKeyboardKey.mediaStop,
  };

  @override
  Widget build(BuildContext context) {
    return Focus(
      autofocus: true,
      // 避免被其他节点抢走焦点
      canRequestFocus: true,
      onKeyEvent: (node, event) {
        final key = event.logicalKey;
        if (_blocked.contains(key)) {
          // 直接吃掉事件：既不下发给子组件，也不让它冒泡
          return KeyEventResult.handled;
        }
        return KeyEventResult.ignored;
      },
      child: child,
    );
  }
}

/// 应用入口 Widget。
///
/// - 在根部包裹 [MultimediaKeyShield]，保证多媒体键不会影响编辑器；
/// - 内部构造 `EditorConfig` 并生成高亮 preset；
/// - 最终传递给 [CanvasEditor] 用于渲染代码编辑器。
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    // 1) 创建编辑器配置（内部自带 metrics）
    const myEditorConfig = EditorConfig();

    // 2) 使用 config.metrics.textStyle 构造高亮 preset，并设置字体
    final preset = makeDartishPreset(
      myEditorConfig.metrics.textStyle.copyWith(
        fontFamily: 'JetBrains Mono',
        fontSize: 15,
        height: 1.2,
      ),
    );

    // 3) 包装为 MaterialApp，并在根部用 MultimediaKeyShield 屏蔽多媒体键
    return MultimediaKeyShield(
      child: MaterialApp(
        home: Scaffold(
          body: CanvasEditor(
            config: myEditorConfig,
            highlighter: preset.highlighter,
            theme: preset.theme,
          ),
        ),
      ),
    );
  }
}
